題目:
這道題目要求我們實現一個標準的二分搜尋演算法,以查找一個整數目標值在排序陣列中的索引。如果找不到該目標值,則回傳 -1。
Divide and Conquer 分治法的精髓,不斷地將問題二分,這邊就來練習二元搜尋來尋找目標,
奇數時 mid 計算沒什麼問題,偶數時 mid 就會有偏左(四捨五入進位),但這不會影響結果,
調整左右邊界時,記得把 mid 排出在下次的搜尋範圍內。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
for (int i = 0; i < nums.size(); i++) {
// int mid = (left + right) / 2; // 相加除2
int mid = left + (right - left) / 2; // left + 1/2 距離, 防止溢出
if (nums[mid] == target)
return mid;
else if (nums[mid] > target)
right = mid-1; // 調整右邊界,下次搜尋排除 mid
else // nums[mid] < target
left = mid+1; // 調整左邊界,下次搜尋排除 mid
}
return -1;
}
};
時間複雜度:O(log n),因為每次將搜尋範圍都減半
空間複雜度:O(1),因為使用有限的空間來儲存結果,不會隨陣列大小增加而增加額外的空間。